/**********************************************
	* @author: Jun
	* @time  : 2018/8/3
	* @brief ：图片管理处理接口
	* @note  ：none
**********************************************/
#include "oc_pic.h"

/**********************************************
 * @brief ：显示一个输入图形数组
 * @param : xpos:      图片显示左上角X轴位置
 * @param : ypos:      图片显示左上角Y轴位置
 * @param : pic:       图像数组
 * @note  ：使用IMG2LCD软件转换,要包含图像头数据
 * @retval: 绘制成功返回OC_OK，失败返回oc_ON
**********************************************/
uint8_t oc_pic_img2lcd(uint16_t xpos, uint16_t ypos,const char *pic)
{
	uint32_t picW=0,picH=0,showW = 0,showH = 0;//图片尺寸信息
	uint32_t arrayLen,showLen = 8;
	uint8_t dataBit,i;
	
	//数组协议，前八个数据包含数据信息
	//bit0:
		//0:0水平扫描，1垂直扫描
		//4:字序 0 高位在后 1 高位在前
		//6：垂直方向 0 顶-->底 1 顶<-- 底
	  //7：水平方向 0 左到右  1 右到左
	//bit1:0x04--16灰，0x10--16位真彩色，0x12--18位真彩色，0x18--24位真彩色，0x20--32位真彩色；
	//bit2~bit5:
		//第3~6个字节表示宽和高，假设图片数组BMP_BUF[],高位在前时
		//bmp_withd=BMP_BUF[2]|BMP_BUF[3]<<8
		//bmp_lenth=BMP_BUF[4]|BMP_BUF[5]<<8
		//数组大小 =  bmp_withd x bmp_lenth x (位数/8) + [ 8(包含头信息时)]
	//bit6:代表颜色数据的排列方式： 0 --- 565； 1 – 555; (16位真色彩)
	picW = pic[2] | (pic[3]<<8);//获取图片宽度
	picH = pic[4] | (pic[5]<<8);//获取图片高度
	dataBit = pic[1]/8;//计算数据位数
	arrayLen = picW*picH*dataBit;
	
	if(!pic[0])//水平扫描方式
	{
		while(showLen < arrayLen)
		{
			uint32_t color = 0;
			for(i=0;i<dataBit;i++)
			{
				color = color | (pic[showLen+i]&0x000000ff) << (8*i);
			}
			oc_base_set_color(color);
			oc_base_dot(showW + xpos,showH + ypos);

			showW++;
			if(showW >= picW)
			{
				showW = 0;
				showH++;
			}
			showLen += dataBit;
		}
	}
	else//垂直扫描方式
	{
		while(showLen < arrayLen)
		{
			uint32_t color = 0;
			for(i=0;i<dataBit;i++)
			{
				color = color | (pic[showLen+i]&0x000000ff) << (8*i);
			}
			oc_base_set_color(color);
			oc_base_dot(showW + xpos,showH + ypos);
			
			showH++;
			if(showH >= picH)
			{
				showH = 0;
				showW++;
			}
			showLen += dataBit;
		}
	}
		
	return OC_OK;
}

/**********************************************
 * @brief ：显示BMP图片，以数组方式，文件形式需要读取二进制文件
 * @param : xpos:      图片显示左上角X轴位置
 * @param : ypos:      图片显示左上角Y轴位置
 * @param : pic:       图像数组
 * @note  ：直接转换BMP原始数据
 * @retval: 绘制成功返回OC_OK，失败返回oc_ON
**********************************************/
uint8_t oc_pic_bmp(uint16_t xpos, uint16_t ypos,const char *pic)
{
	oc_pic_bmp_heard_t oc_pic_bmp_heard;
	oc_bmpInforheard_t oc_bmpInforheard;
	
	uint32_t showLen,showW = 0,showH = 0;
	uint8_t dataBit,i;
	
	//获取BMP图像数据信息
	//BMP文件头
	oc_pic_bmp_heard.bfType = pic[0x00] << 8 | pic[0x01];//文件标识符，必须为"BM"，即0x424D 才是Windows位图文件
	oc_pic_bmp_heard.bfSize = (pic[0x05] << 24 |pic[0x04] << 16 |pic[0x03] << 8 |pic[0x02] << 0)/1024;//整个BMP文件的大小（以位B为单位）
	oc_pic_bmp_heard.bfOffBits = pic[0x0a];//说明从文件头0000h开始到图像像素数据的字节偏移量（以字节Bytes为单位），以为位图的调色板长度根据位图格式不同而变化，可以用这个偏移量快速从文件中读取图像数据
	
	//BMP信息头
	oc_bmpInforheard.biSize = pic[0x0e];//BNP信息头即BMP_INFOHEADER结构体所需要的字节数（以字节为单位）
	oc_bmpInforheard.biWidth = pic[0x15] << 24 |pic[0x14] << 16 |pic[0x13] << 8 |pic[0x12] << 0;//说明图像的宽度（以像素为单位）
	oc_bmpInforheard.biHeight =  pic[0x19] << 24 |pic[0x18] << 16 |pic[0x17] << 8 |pic[0x16] << 0;//说明图像的高度（以像素为单位）。这个值还有一个用处，指明图像是正向的位图还是倒向的位图，该值是正数说明图像是倒向的即图像存储是由下到上；该值是负数说明图像是倒向的即图像存储是由上到下。大多数BMP位图是倒向的位图，所以此值是正值。
	oc_bmpInforheard.biPlanes = pic[0x1a] | pic[0x1b] << 8;//为目标设备说明位面数，其值总设置为1
	oc_bmpInforheard.biBitCount = pic[0x1c] | pic[0x1d] << 8;//说明一个像素点占几位（以比特位/像素位单位），其值可为1,4,8,16,24或32
	oc_bmpInforheard.biCompression = pic[0x21] << 24 |pic[0x20] << 16 |pic[0x1f] << 8  |pic[0x1e] << 0; //说明图像数据的压缩类型，取值范围为：
																									//0         BI_RGB 不压缩（最常用）
																									//1         BI_RLE8 8比特游程编码（BLE），只用于8位位图
																									//2         BI_RLE4 4比特游程编码（BLE），只用于4位位图
																									//3         BI_BITFIELDS比特域（BLE），只用于16/32位位图
	oc_bmpInforheard.biSizeImage = pic[0x25] << 24 |pic[0x24] << 16 |pic[0x23] << 8 |pic[0x22] << 0;//说明图像的大小，以字节为单位。当用BI_RGB格式时，总设置为0
	oc_bmpInforheard.biXPelsPerMeter = pic[0x29] << 24 |pic[0x28] << 16 |pic[0x27] << 8 |pic[0x26] << 0;//说明水平分辨率，用像素/米表示，有符号整数
	oc_bmpInforheard.biYPelsPerMeter = pic[0x2d] << 24 |pic[0x2c] << 16 |pic[0x2b] << 8 |pic[0x2a] << 0;//说明垂直分辨率，用像素/米表示，有符号整数
	oc_bmpInforheard.biClrUsed = pic[0x31] << 24 |pic[0x30] << 16 |pic[0x2f] << 8 |pic[0x2e] << 0;//实际使用的调色板索引数，0：使用所有的调色板索引
	oc_bmpInforheard.biClrImportant = pic[0x35] << 24 |pic[0x34] << 16 |pic[0x33] << 8 |pic[0x32] << 0;//说明对图像显示有重要影响的颜色索引的数目，如果是0，表示都重要。
	
	OC_DEBUG("head:%x",oc_pic_bmp_heard.bfType);
	//解析BMP图像信息
	if(oc_pic_bmp_heard.bfType == 0x424D)
	{//判断是不是BMP图像
		showLen = oc_pic_bmp_heard.bfOffBits;
		dataBit = oc_bmpInforheard.biBitCount / 8;
		oc_bmpInforheard.biSizeImage = oc_pic_bmp_heard.bfSize - sizeof(oc_bmpInforheard_t);

		OC_DEBUG("showLen:%d dataBit:%d biHeight:%d",showLen,dataBit,oc_bmpInforheard.biHeight);
		OC_DEBUG("biSizeImage:%d",oc_bmpInforheard.biSizeImage);
		while(showLen < oc_bmpInforheard.biSizeImage)
		{
			uint32_t color = 0;
			for(i=0;i<dataBit;i++)
			{
				color = color | (pic[showLen+i]&0x000000ff) << (8*i);
			}

			//OC_DEBUG("x:%d y:%d color:%x",xpos + showW,ypos + oc_bmpInforheard.biHeight - showH,color);

			oc_base_set_color(color);
			oc_base_dot(xpos + showW,ypos + oc_bmpInforheard.biHeight - showH);
			
			showW++;
			if(showW >= oc_bmpInforheard.biWidth)
			{
				showW = 0;
				showH++;
			}
			showLen += dataBit;
		}
	}
	
	return OC_OK;
}


